import java.util.*;

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
//        int[] ret = new int[0];
        List<Integer> re = new ArrayList<>();

        Map<Integer,Integer> numsMap1 = new HashMap<>();
        for (int i :
                nums1) {
            numsMap1.put(i,numsMap1.getOrDefault(i,0)+1);
        }

        Map<Integer,Integer> numsMap2 = new HashMap<>();
        for (int i :
                nums2) {
            numsMap2.put(i,numsMap2.getOrDefault(i,0)+1);
        }

        for (int i : numsMap1.keySet()) {
            if(numsMap2.containsKey(i)){
                int num = numsMap1.get(i) < numsMap2.get(i) ? numsMap1.get(i) : numsMap2.get(i);
                for (int j = 0; j < num; j++) {
//                    ret = Arrays.copyOf(ret,ret.length+1);
//                    ret[ret.length - 1] = i;
                    re.add(i);
                }
            }
        }

//        return ret;
        return re.stream().mapToInt(x->x).toArray();
    }
}